//============================================================================================
/**
 * @file	pm_str.h
 * @brief	文字列関連処理
 * @author	Hiroyuki Nakamura
 * @date	2004.11.02
 */
//============================================================================================
#ifndef PM_STR_H
#define PM_STR_H

#include "gflib\msg_print.h"	// STRCODE 定義のため

#undef GLOBAL
#ifdef PM_STR_H_GLOBAL
#define GLOBAL	/*	*/
#else
#define GLOBAL	extern
#endif


//============================================================================================
//	シンボル定義
//============================================================================================
enum {
	NUM_MODE_LEFT = 0,		// 左詰
	NUM_MODE_SPACE,			// 右詰、足りない部分は空白
	NUM_MODE_ZERO			// 右詰、足りない部分は数字のゼロ
};


//============================================================================================
//	グローバル変数
//============================================================================================
#ifndef PM_STR_H_GLOBAL
GLOBAL STRCODE	MsgExpandBuffer[];
#endif


//============================================================================================
//	プロトタイプ宣言
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 文字列コピー
 *
 * @param	to_str		コピー先バッファ
 * @param	from_str	文字列データ
 *
 * @return	バッファにコピーしたデータ最後のEOM_へのポインタ
 *
 *	データがない(文字列データ先頭がEOM_だった)場合、
 *	EOM_をバッファ先頭に書きこみ、そこへのポインタを返す
 */
//--------------------------------------------------------------------------------------------
GLOBAL u16 * PM_strcpy( u16 * to_str, const u16 * from_str );

//--------------------------------------------------------------------------------------------
/**
 * 文字列コピー（文字数指定）
 *
 * @param	to_str		コピー先バッファ
 * @param	from_str	文字列データ
 * @param	len			コピーする文字数
 *
 * @return	「コピー先バッファ + コピーする文字数」へのポインタ
 */
//--------------------------------------------------------------------------------------------
GLOBAL STRCODE * PM_strncpy( STRCODE* to_str, const STRCODE* from_str, u32 len );

//--------------------------------------------------------------------------------------------
/**
 * 文字列連結
 *
 * @param	to_str		連結されるデータ（ram上にあること！！）
 * @param	from_str	連結するデータ
 *
 * @return	連結後のバッファ上のデータ末のEOM_へのポインタ
 */
//--------------------------------------------------------------------------------------------
GLOBAL STRCODE* PM_strcat( STRCODE* to_str, const STRCODE* from_str );

//--------------------------------------------------------------------------------------------
/**
 * 文字列連結（文字数指定）
 *
 * @param	to_str		連結されるデータ（ram上にあること！！）
 * @param	from_str	連結するデータ
 * @param	len			連結する文字数
 *
 * @return	連結後のバッファ上のデータ末へのポインタを返す
 */
//--------------------------------------------------------------------------------------------
GLOBAL STRCODE* PM_strncat( STRCODE* to_str, const STRCODE* from_str, u32 len );

//--------------------------------------------------------------------------------------------
/**
 * 文字列長取得
 *
 * @param	str		対象文字列へのポインタ
 *
 * @return	対象文字列の長さ（EOM_までの文字数）を返す
 */
//--------------------------------------------------------------------------------------------
GLOBAL u32 PM_strlen( const STRCODE* str );

//--------------------------------------------------------------------------------------------
/**
 * 文字列比較
 *
 * @param	s		対象文字列へのポインタ
 * @param	t		対象文字列へのポインタ
 *
 * @retval	"0 = 一致"
 * @retval	"1 = 不一致"
 *
 * @li	Ｃ標準関数と違い長さの比較はしていない
 */
//--------------------------------------------------------------------------------------------
GLOBAL BOOL PM_strcmp( const STRCODE* s, const STRCODE* t );

//--------------------------------------------------------------------------------------------
/**
 * 文字列比較（文字数指定）
 *
 * @param	s		対象文字列へのポインタ
 * @param	t		対象文字列へのポインタ
 * @param	n		比較する文字数
 *
 * @retval	"0 = 一致"
 * @retval	"1 = 不一致"
 *
 * @li	Ｃ標準関数と違い長さの比較はしていない
 */
//--------------------------------------------------------------------------------------------
GLOBAL BOOL PM_strncmp( const STRCODE* s, const STRCODE* t, u32 n );

//--------------------------------------------------------------------------------------------
/**
 * 文字列入力チェック
 *
 * @param	str		対象文字列へのポインタ
 * @param	n		チェックする文字数
 *
 *
 * @retval	"1 = 入力あり"
 * @retval	"0 = 入力なし"
 *
 * @li	指定されたバッファに空白とEOM以外のコードが含まれているかチェック
 */
//--------------------------------------------------------------------------------------------
GLOBAL BOOL PM_strnchk( STRCODE* str, u32 n );

//--------------------------------------------------------------------------------------------
/**
 * 文字列バッファを指定文字コードでクリア
 *
 * @param	str		文字列バッファ
 * @param	code	文字コード
 * @param	len		クリアする文字数
 *
 * @return	EOM_ アドレス
*/
//--------------------------------------------------------------------------------------------
GLOBAL STRCODE* PM_strclear( STRCODE * str, STRCODE code, u32 len );

//--------------------------------------------------------------------------------------------
/**
 * 文字列バッファをEOM_コードでクリア
 *
 * @param	str		文字列バッファ
 * @param	len		クリアする文字数
 *
 * @return	クリア終端のEOM_ アドレス
 */
//--------------------------------------------------------------------------------------------
GLOBAL STRCODE * PM_strclearEOM_( STRCODE * str, u32 len );

//--------------------------------------------------------------------------------------------
/**
 * 文字列コピー後、指定文字数に満たない分だけ、指定文字コードでクリア
 *
 * @param	to		コピー先文字列バッファ
 * @param	from	コピー元文字列
 * @param	code	クリア文字コード
 * @param	len		全体の文字数
 *
 * @return	EOM_ アドレス
 */
//--------------------------------------------------------------------------------------------
GLOBAL STRCODE* PM_strcpy_clear( STRCODE* to, const STRCODE* from, STRCODE code, u32 len );

//--------------------------------------------------------------------------------------------
/**
 * 数値を文字列に変換（１０進）
 *
 * @param	buf		文字列展開場所
 * @param	num		数値
 * @param	type	変換方式
 * @param	keta	桁数
 *
 * @return	数値の後ろに書きこんだEOM_へのポインタ
 *
 * @li	type = NUM_MODE_LEFT	左詰
 * @li	type = NUM_MODE_SPACE	右詰、足りない部分は空白
 * @li	type = NUM_MODE_ZERO	右詰、足りない部分は数字のゼロ
 */
//--------------------------------------------------------------------------------------------
GLOBAL STRCODE* PM_NumMsgSet( STRCODE* buf, s32 num, u32 type, u32 keta );

//--------------------------------------------------------------------------------------------
/**
 * 数値を文字列に変換（１０進、マイナスはなし）
 *
 * @param	buf		文字列展開場所
 * @param	num		数値
 * @param	type	変換方式
 * @param	keta	桁数
 *
 * @return	数値の後ろに書きこんだEOM_へのポインタ
 *
 * @li	type = NUM_MODE_LEFT	左詰
 * @li	type = NUM_MODE_SPACE	右詰、足りない部分は空白
 * @li	type = NUM_MODE_ZERO	右詰、足りない部分は数字のゼロ
 */
//--------------------------------------------------------------------------------------------
GLOBAL STRCODE* PM_NumMsgSetUnsigned( STRCODE* buf, u32 num, u32 type, u32 keta );

//--------------------------------------------------------------------------------------------
/**
 * 数値を文字列に変換（１６進）
 *
 * @param	buf		文字列展開場所
 * @param	num		数値
 * @param	type	変換方式
 * @param	keta	桁数
 *
 * @return	数値の後ろに書きこんだEOM_へのポインタ
 *
 * @li	type = NUM_MODE_LEFT	左詰
 * @li	type = NUM_MODE_SPACE	右詰、足りない部分は空白
 * @li	type = NUM_MODE_ZERO	右詰、足りない部分は数字のゼロ
 */
//--------------------------------------------------------------------------------------------
GLOBAL STRCODE* PM_HexNumMsgSet( STRCODE* buf, s32 num, u32 type, u32 keta );

//--------------------------------------------------------------------------------------------
/**
 * メッセージ展開処理（S_MSG_込み）
 *
 * @param	buf		展開先
 * @param	data	元メッセージ
 *
 * @return	EOM_のアドレス
 */
//--------------------------------------------------------------------------------------------
GLOBAL STRCODE* PM_MsgExpand( STRCODE* buf, const STRCODE* data );

//--------------------------------------------------------------------------------------------
/**
 * S_MSG_初期化処理
 *
 * @param	none
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
GLOBAL void MsgExp_Init(void);

//--------------------------------------------------------------------------------------------
/**
 * S_MSG_設定処理
 *
 * @param	id		ID
 * @param	str		セットする文字列
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
GLOBAL void MsgExp_AdrsSet( u32 id, const STRCODE* str );


//--------------------------------------------------------------------------------------------
/**
 * 数値を文字列に変換 ( str )
 *
 * @param	str		文字列格納場所
 * @param	num		変換する数値
 * @param	keta	桁
 *
 * @return	none
 *
 * @li	ファイル名の作成などに使用する関数。
 * @li	keta = 0  : 左詰め
 * @li	keta != 0 : 0で埋める
 */
//--------------------------------------------------------------------------------------------
GLOBAL void StrNumSet( char* str, u32 num, u32 keta );



#undef GLOBAL
#endif	/* PM_STR_H */